package com.psc.view.customized;

import android.view.animation.Animation;
import android.graphics.Camera;
import android.graphics.Matrix;
import android.view.animation.Transformation;

/**
 * Creator:Yx
 * Time:2020/7/31 17:49
 * Description:翻转，旋转动画
 * 使用：
 * public void inFlip(View mHeader) {//参三翻转时长；mInitTop = mHeader.getTop();//mCurrentTop = mHeader.getTop()+移动距离
 * RotateAnimation animation = new RotateAnimation();
 * animation.setFillAfter(true);
 * animation.setInterpolatedTimeListener(interpolatedTime -> {
 * // 监听到翻转进度过半时，更新图片内容，
 * if (interpolatedTime > 0.5f) {
 * }
 * });
 * mHeader.startAnimation(animation);
 * }
 */
public class RotateAnimation extends Animation {

    private final String TAG = RotateAnimation.class.getSimpleName();

    /**
     * Z轴上最大深度。
     */
    public static final float DEPTH_Z = 200.0f;
    /**
     * 动画显示时长。
     */
    public static final long DURATION = 1000;

    private float centerX;// 中心坐标
    private float centerY;// 中心坐标
    private Camera mCamera;
    /**
     * 用于监听动画进度。当值过半时需更新txtNumber的内容。
     */
    private InterpolatedTimeListener listener;

    public void setInterpolatedTimeListener(InterpolatedTimeListener listener) {
        this.listener = listener;
    }

    /**
     * 这是一个回调函数告诉Animation目标View的大小参数(就是你要运行空间的宽度和高度.) *
     */
    public void initialize(int width, int height, int parentWidth,
                           int parentHeight) {
        // 在构造函数之后、getTransformation()之前调用本方法。
        super.initialize(width, height, parentWidth, parentHeight);

        centerX = width / 2;
        centerY = height / 2;
        setDuration(DURATION);
        mCamera = new Camera();
    }

    @Override
    public boolean getTransformation(long currentTime,
                                     Transformation outTransformation) {
        return super.getTransformation(currentTime, outTransformation);
    }

    /**
     * 这个类需要重写,在绘制动画的时候会反复执行. interpolatedTime：该参数从0渐 变为1. 0:表示动画开始执行. 0.5表示中间值.
     * 1:表示动画结束. Transformation:获取变化的矩阵.matrix
     */
    protected void applyTransformation(float interpolatedTime,
                                       Transformation transformation) {
        float from = 0.0f, to = 180.0f;
        float degree = from + (to - from) * interpolatedTime;// 翻转的角度
        if (degree == 180)
            return;

        if (interpolatedTime > 0.5f) {
            // 翻转过半的情况下，为保证显示内容不出现镜面效果就是对称形状，需要将角度逆向回来.
            degree = degree - 180;
        }

        float depth = (0.5f - Math.abs(interpolatedTime - 0.5f)) * DEPTH_Z;// 深度

        final Matrix matrix = transformation.getMatrix();
        mCamera.save();
        mCamera.translate(0.0f, 0.0f, depth);
        mCamera.rotateY(degree);
        mCamera.getMatrix(matrix);
        mCamera.restore();

        // 确保图片的翻转过程一直处于组件的中心点位置
        matrix.preTranslate(-centerX, -centerY);
        matrix.postTranslate(centerX, centerY);

        // interpolatedTime:动画进度值，范围为[0.0f,1.0f]
        if (listener != null) {
            listener.interpolatedTime(interpolatedTime);
        }

    }

    /**
     * 动画进度监听器。
     */
    public static interface InterpolatedTimeListener {
        public void interpolatedTime(float interpolatedTime);
    }

}
